#ifndef TRAINDATA_H
#define TRAINDATA_H

class trainData;

//存储键值对
class keyValue
{
public:
    int isNum;
    char key[20];
    int valueInt;
    char valueStr[50];

    keyValue();
    keyValue(int in, char* k, int vi, char* vs);    //初始化键值对，输入指定的数据生成一个键值对
                                                    //in isNum, k key, vi valueInt, vs valueStr
    int setValue(int in, char* k, int vi, char* vs);    //设置键值对
};

//存储每一个数据
class valueItem
{
private:
    int keyValueNum;        //存储的键值对的数量，初始化键值对
    int addedKeyValueNum;   //已存储的键值对数量
    keyValue* item;         //存储的键值对
    valueItem* nextItem;    //下一个数据
public:
    valueItem();
    int setKeyValueNum(int n);      //设置键值对数量
    int addKeyValue(keyValue* n);   //添加新键值对
    int setNextItem(valueItem* n);  //设置下一个键值对

    int getKeyValueNum();           //获取键值对数量
    keyValue* getItem();                //获取数据
    keyValue* getKeyValue(int num);     //获取指定的键值对
    keyValue* getKeyValue(char* k);     //根据k获取键值对
    valueItem* getNextItem();       //获取下一个数据

};


//存储指定key中各个value的数量
class valueSelect
{
public:
    char key[30];   //键
    int valueNum;   //指定key下不同值的数量
    char value[30]; //值
    int classNum;   //同一个值的数量
    valueSelect* nextValue;

    valueSelect();
    ~valueSelect();
    int clean();
    valueSelect* isValueExist(char* v); //指定值是否存在
    int addValue(char* v);      //增加值
    int setKey(char* k);        //设置键
};


//从trainDta中选择所需的项
class dataChosen
{
public:
    dataChosen* nextData;
    valueItem* item;
    int dataNum;

    dataChosen();
    int clean();
    dataChosen(trainData* d);
    int addItem(valueItem* n);
    valueSelect* getValueClass(char* k);    //获取指定key下value的分类
    dataChosen* getKeyValueItem(char* k, char* v);  //根据key和value获取指定的item
    //dataChosen* getSortData(char* k);       //获取连续属性排序后的训练数据
    double info();  //计算按类别class的期望
    double infoKey(char* k);      //计算按k的期望
    double gain(char *k);      //计算按k的信息增益
    static int quickSort(int* l, int begin, int end);     //快排算法,begin,end均为索引值
    double infoKeyContin(char* k, int getV = 0);      //以k为键的连续属性的期望值
    dataChosen* getKeyContin(char* k, double divi, int sign);  //获取以k为键，divi为分隔的数据
                                                            //其中sign为标记：-1小于等于，1大于
};

//存储所有数据
class trainData
{
public:
    int itemNum;            //数据的数量
    valueItem* itemLib;     //存储所有数据的链表
    valueItem* itemLibTail;     //指向链表的最后一个元素

    trainData();
    int addItem(valueItem n);
    int showData();
    //valueSelect* getValueClass(char* k);    //获取指定key下value的分类
    //dataChosen* getKeyValueItem(char* k, char* v);  //根据key和value获取指定的item
    //dataChosen* getSortData(char* k);       //获取连续属性排序后的训练数据
};

#endif // TRAINDATA_H
